package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.MemberDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Member;
import com.itheima.service.MemberService;
import com.itheima.utils.MD5Utils;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @desc 会员相关的业务处理
 * @Date 2020/10/19 15:40
 */
@Service
@Transactional
public class MemberServiceImpl implements MemberService {

    //注入会员操作的dao
    @Autowired
    private MemberDao memberDao;


    /**
     * 通过电话号码查询会员信息
     *
     * @param telephone 电话号码
     * @return
     */
    @Override
    public Member findBytelephone(String telephone) {

        //直接调用方法进行查询
        return memberDao.findByTelephone(telephone);

    }


    /**
     * 添加会员
     *
     * @param member 会员的基本信息
     */
    @Override
    public void add(Member member) {

        //用户注册可能有密码，有密码就需要进行加密的处理
        String password = member.getPassword();
        if(password != null) {
            //用户设置了密码，加密
            password =MD5Utils.md5(password);
            //建加密后的密码设置回对象里进行添加
            member.setPassword(password);
        }

        String fileNumber = member.getFileNumber();

        //调用方法，判断档案号时候存在
        boolean existFileNumber = ifExistFileNumber(fileNumber);

        if (existFileNumber){
            throw new RuntimeException("档案号已存在");
        }



        //调用方法进行会员的添加
        memberDao.add(member);
    }


    /**
     * 根据月份查询会员数量
     * @param months
     * @return
     */
    @Override
    public List<Integer> findMemberCountByMonths(List<String> months) {

        //存放每个月的会员数量
        List<Integer> list = new ArrayList<>();

        for (String month : months) {
            //传过来的月份是 yuyyy.MM格式的，需要进行处理
            month = month + ".31";
            //用过设置后的数据查询数据库
            Integer count = memberDao.findMemberCountBeforeDate(month);
            //将查询出来的数量添加到集合之中
            list.add(count);
        }

        return list;
    }

    /**
     * 查询所有的会员的信息
     *
     * @param queryPageBean 页码 条数  查询条件
     * @return
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        //获取需要查询的详细的数据
        Integer currentPage = queryPageBean.getCurrentPage();//页码
        Integer pageSize = queryPageBean.getPageSize();//条数
        String queryString = queryPageBean.getQueryString();//查询条件


        //使用分页查询插件
        PageHelper.startPage(currentPage, pageSize);

        //使用条件模糊查询
        Page<Member> result = memberDao.findByCondition(queryString);

        long total = result.getTotal(); //总条数
        List<Member> list = result.getResult();  //所有的数据


        return new PageResult(total,list);
    }

    /**
     * 修改用户信息
     *
     * @param member 修改后的信息
     */
    @Override
    public void update(Member member) {


        memberDao.edit(member);
    }

    /**
     * 通过id查询用户的所有信息
     *
     * @param id 用户的id
     * @return
     */
    @Override
    public Member findById(Integer id) {
        return memberDao.findById(id);
    }

    /**
     * 删除用户
     *
     * @param id 用户的id
     */
    @Override
    public void delete(Integer id) {


        //先删除体检报告
        memberDao.deleteByRelation(id);

        //查询这个用户有没有预约
        Long count = memberDao.getOrder(id);

        if (count != null && count > 0){
            //表示这个用户已经预约了，禁止删除
            throw new RuntimeException("用户已经预约了，禁止删除");
        }



        //通过id删除用户
        memberDao.deleteById(id);
    }

    /**
     * 获取用户所有的数据
     *
     * @return
     */
    @Override
    public  List<Member> memberExcel() {

        //查出来的所有的数据
        List<Member> list = memberDao.findAll();

        return list;
    }


    /**
     * 传入一个档案号，判断档案号是否存在
     * @param fileNumber 档案号的名字
     * @return  存在就返回true
     */
    private boolean ifExistFileNumber(String fileNumber) {

        //不存在返回false
        boolean flag = false;



        if (fileNumber != null){
            //查询所有的档案号，看有没有重复的
            List<Member> all = memberDao.findAll();
            for (Member m : all) {

                //数据库里面的每一个档案编号
                String name = m.getFileNumber();

                //判断
                if (fileNumber.equals(name) || fileNumber == name){
                    //存在将状态改为true
                    return flag = true;
                }
            }
        }
        return false;
    }




}
